package com.hit.dissim.algorithm;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class RssAlg {
	static String basedir = findGenes.getRootPath() + "\\FileResource";
	static File ref = new File(basedir + "\\Ref.txt");
//	static File ref = new File("D:\\dissim\\pmid_ontology_number.txt");	
	
	/**
	 * 单元测试
	 * @param args
	 */
	public static void main(String[] args) {
		RssAlg rss = new RssAlg();
		rss.getResult("GO:0042310", "GO:0060004");
//		rss.watchFile();
	}
	
	/**
	 * 需要调用的函数
	 * @param tid1
	 * @param tid2
	 * @return 经过标准化后的rs值
	 */
	public double getResult(String tid1, String tid2) {
//		File ref = new File("E:\\硕士\\dissim\\Ref.txt");
		
		List<String> pmlist = new ArrayList<String>();
		List<String> list1 = new ArrayList<String>();	//列表1，id1出现过的序号 
		List<String> list2 = new ArrayList<String>();	//列表2
		try {
			Scanner in = new Scanner(new FileInputStream(ref));
			in.nextLine();
			while(in.hasNextLine()){
				String line = in.nextLine();
				String[] terms = line.split("[\t|]+");	//通过制表符和|进行分割
				
				//1、这里的count是初步的实现思路，在两个id在一条记录中出现了的时候记作找到一次，也即是count为2的时候。
				//1、后来换了一种实现思路，找到两条列表，然后对这两个list求交然后的结果，优点是保留的信息更多一点，但是这些信息也用不上				
//				int count = 0;	
				
				//这里循环从1开始，到倒数第三个结束，中间这一段刚好是term所在的部分，对这一部分进行遍历
				for(int i=1;i<terms.length-2;i++) {
					if(terms[i].equals(tid1)) {
						list1.add(terms[0]);
					}
					if(terms[i].equals(tid2)) {
						list2.add(terms[0]);
					}
				}
			}
			in.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		pmlist.addAll(list1);		//将结果添加到pmlist中
		pmlist.retainAll(list2);	//求两个集合的交
		
		//查看结果
		System.out.println("pmids that contains " + tid1 + ": total " + list1.size());	
		System.out.println("pmids that contains " + tid2 + ": total " + list2.size());
		System.out.println("size: " + pmlist.size());		//打印相关的文献
		System.out.println(pmlist);		//打印相关的文献
		
		//计算R分值
		double Rs = 0;
		if(!(list1.size() == 0 || list2.size() == 0))
			Rs = Math.log10((double)pmlist.size()/(list1.size()*list2.size()));
		System.out.println("Rs = " + Rs);
		
		//TODO 标准化
		return BaseUtil.saveRsandStandardize("rss", tid1, tid2, Rs);
	}
	
	private void watchFile(){
		Scanner in;
		try {
			in = new Scanner(new FileInputStream(ref));
			String tmp = in.nextLine();
			for(int i=0;i<10;i++){
				System.out.println(tmp);
				tmp = in.nextLine();
			}
			in.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
